NSubstitute(簡稱 NSub)是一套友善的 .NET 隔離框架套件,讓開法者以簡單、乾淨的語法撰寫測試,這套框架是採用 3A 原則 (Arrange-Act-Assert) 和測試驅動開發(Test Driven Development, TDD)為核心設計出來的套件(翻譯自 NSubstitute 在 Nuget 的介紹)。雖然這邊是以 NSubstitute 為範例,但這邊所撰寫的邏輯也大都適用於其他的隔離框架如 Moq、FakeItEasy、NSubstitute、Typemock Isolator 與 JustMock。
那接下來介紹如何在測試專案上安裝 NSubstitute,其截圖如下(以 Visual Studio For Mac 為例):
那介紹 NSubstitute 語法之前,我們先簡單回顧 Day-10 所寫的商業邏輯、假物件與測試,如下:
此段為建置 Email 通知系統的商業邏輯與介面:
public class EmailSystem
{
private IEmailService EmailService;
public EmailSystem(IEmailService inEmailService)
{
EmailService = inEmailService;
}
public string EmailFunction(string mailAddress, string mailMessage)
{
var SendResult = EmailService
.SendEmail(mailAddress, mailMessage);
return SendResult;
}
}
public interface IEmailService()
{
public string SendEmail(mailAddress, mailMessage);
}
而此段為建置 Email 通知系統的測試與虛設常式:
using NUnit3;
[TestFixture]
public class EmailSystemUnitTests
{
[Test]
public void EmailFunction_Success()
{
// Arrange
StubEmailSerivce stubEmailService = new StubEmailSerivce();
EmailSystem EmailService = new EmailSystem(stubEmailService);
// Act
var stubResult = EmailSystem
.EmailFunction("Test@abc.com.tw", "Test Demo");
// Assert
Assert.AreEqual("Success", stubResult);
}
}
public class StubEmailSerivce : IEmailService
{
public string SendEmail(EmailAddress, EmailMessage)
{
return "Success";
}
}
在這邊我們手刻了一個 StubEmailSerivce 的虛設常式,做為 IEmailService 的實作;倘若今天用 NSub,則程式碼如下:
using NUnit3;
[TestFixture]
public class EmailSystemUnitTests
{
[Test]
public void EmailFunction_Success()
{
// Arrange
IEmailService stubEmailService = Substitute.For<IEmailService>();
stubEmailService.SendEmail("Test@abc.com.tw", "Test Demo").Returns("Success");
EmailSystem EmailService = new EmailSystem(stubEmailService);
// Act
var stubResult = EmailSystem
.EmailFunction("Test@abc.com.tw", "Test Demo");
// Assert
Assert.AreEqual("Success", stubResult);
}
}
上述的過程中,NSub 新增虛設常式做了兩個步驟:
這樣子,Day-10 的手刻的物件就改成了 NSub 的寫法,接下來會開始介紹 NSub 的一些基本用法。